Yii 提供一整套工具來簡化實作 RESTful Web Service API 的任務。特別是,Yii 支援關於 RESTful API 的以下功能
OPTIONS
和 HEAD
動詞;在下面,我們使用一個範例來說明如何以最少的程式碼工作量建構一組 RESTful API。
假設您想要透過 RESTful API 公開使用者資料。使用者資料儲存在 user
資料庫表格中,並且您已經建立了 active record 類別 app\models\User
以存取使用者資料。
首先,建立一個 控制器 類別 app\controllers\UserController
如下
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
控制器類別繼承自 yii\rest\ActiveController,它實作了一組通用的 RESTful 行動。透過將 modelClass 指定為 app\models\User
,控制器就知道可以使用哪個模型來提取和操作資料。
然後,修改應用程式組態中 urlManager
組件的組態
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
上面的組態主要為 user
控制器新增一個 URL 規則,以便可以使用漂亮的 URL 和有意義的 HTTP 動詞來存取和操作使用者資料。
注意:Yii 將自動將控制器名稱複數化以用於端點(請參閱下面的試用看看章節)。您可以使用 yii\rest\UrlRule::$pluralize 屬性來組態此行為。
為了讓 API 接受 JSON 格式的輸入資料,請組態 request
應用程式組件 的 parsers 屬性,以使用 yii\web\JsonParser 進行 JSON 輸入
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
]
資訊:上面的組態是選用的。如果沒有上面的組態,API 將僅識別
application/x-www-form-urlencoded
和multipart/form-data
輸入格式。
透過上述最少的工作量,您已經完成了建立 RESTful API 以存取使用者資料的任務。您已建立的 API 包括
GET /users
:逐頁列出所有使用者;HEAD /users
:顯示使用者列表的概觀資訊;POST /users
:建立新使用者;GET /users/123
:傳回使用者 123 的詳細資訊;HEAD /users/123
:顯示使用者 123 的概觀資訊;PATCH /users/123
和 PUT /users/123
:更新使用者 123;DELETE /users/123
:刪除使用者 123;OPTIONS /users
:顯示關於端點 /users
的支援動詞;OPTIONS /users/123
:顯示關於端點 /users/123
的支援動詞。您可以使用類似以下的 curl
命令來存取您的 API,
$ curl -i -H "Accept:application/json" "https://127.0.0.1/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://127.0.0.1/users?page=1>; rel=self,
<http://127.0.0.1/users?page=2>; rel=next,
<http://127.0.0.1/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
嘗試將可接受的內容類型變更為 application/xml
,您將看到結果以 XML 格式傳回
$ curl -i -H "Accept:application/xml" "https://127.0.0.1/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<item>
<id>1</id>
...
</item>
<item>
<id>2</id>
...
</item>
...
</response>
以下命令將透過傳送具有 JSON 格式使用者資料的 POST 請求來建立新使用者
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" \
-XPOST "https://127.0.0.1/users" \
-d '{"username": "example", "email": "user@example.com"}'
HTTP/1.1 201 Created
...
Location: http://127.0.0.1/users/1
Content-Length: 99
Content-Type: application/json; charset=UTF-8
{"id":1,"username":"example","email":"user@example.com","created_at":1414674789,"updated_at":1414674789}
提示:您也可以透過在 Web 瀏覽器中輸入 URL
https://127.0.0.1/users
來存取您的 API。但是,您可能需要一些瀏覽器外掛程式來傳送特定的請求標頭。
如您所見,在回應標頭中,有關於總計數、頁面計數等資訊。還有一些連結可讓您導覽到其他資料頁面。例如,https://127.0.0.1/users?page=2
將為您提供下一頁使用者資料。
使用 fields
和 expand
參數,您也可以指定結果中應包含哪些欄位。例如,URL https://127.0.0.1/users?fields=id,email
將僅傳回 id
和 email
欄位。
資訊:您可能已經注意到
https://127.0.0.1/users
的結果包含一些敏感欄位,例如password_hash
、auth_key
。您當然不希望這些出現在您的 API 結果中。您可以而且應該從結果中移除這些欄位,如資源章節中所述。
此外,您可以對集合進行排序,例如 https://127.0.0.1/users?sort=email
或 https://127.0.0.1/users?sort=-email
。可以使用資料過濾器實作過濾集合,例如 https://127.0.0.1/users?filter[id]=10
或 https://127.0.0.1/users?filter[email][like]=gmail.com
。有關詳細資訊,請參閱過濾集合章節。
為了變更模型列表的預設分頁和排序,您可以組態控制器中的 yii\rest\IndexAction。例如
<?php
namespace app\controllers;
use yii\rest\ActiveController;
use yii\helpers\ArrayHelper;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
public function actions()
{
return ArrayHelper::merge(parent::actions(), [
'index' => [
'pagination' => [
'pageSize' => 10,
],
'sort' => [
'defaultOrder' => [
'created_at' => SORT_DESC,
],
],
],
]);
}
}
有關如何組態 ActiveController 的操作的更多資訊,請參閱擴展 ActiveController。
使用 Yii RESTful API 框架,您可以根據控制器操作來實作 API 端點,並且您可以使用控制器來組織實作單一資源類型端點的操作。
資源表示為從 yii\base\Model 類別擴展的資料模型。如果您正在使用資料庫(關聯式或 NoSQL),建議您使用 ActiveRecord 來表示資源。
您可以使用 yii\rest\UrlRule 來簡化到您的 API 端點的路由。
雖然不是必需的,但建議您將 RESTful API 開發為一個獨立的應用程式,與您的 Web 前端和後端不同,以便於維護。
發現錯字或您認為此頁面需要改進?
在 github 上編輯它 !
要傳回 json,請在回應中新增此內容
**components' => [
*//other config...* 'response' => [ 'format' => yii\web\Response::FORMAT_JSON, 'charset' => 'UTF-8', // ... ],** * //other config...*
預設組態根據請求標頭傳回 xml 或 json,當您從瀏覽器開啟時 - 您將獲得 xml,使用以下標頭您將獲得 json:Accept: application/json; q=1.0, /; q=0.1
這是更好的實踐,因為它為第三方開發人員在選擇格式方面提供了更大的自由度
404 錯誤 - 當我按照本教學進行操作時。
在此伺服器上找不到請求的 URL。
應該為 N00bs 新增更具體的程式碼範例和資訊。
這個範例不是最好的,因為它使用
app\models\User
模型,而在基本的 Yii2 應用程式中(以及在瀏覽本教學建立的應用程式中),app\models\User
模型用作應用程式組態中的identityClass
。也許我們應該將本教學改為基於 app\models\Country 模型,該模型是作為使用資料庫章節的一部分開發的?或者至少警告使用者以上內容?
正如 @hawkwynd 所說,本教學有一個錯誤。啟用
'enableStrictParsing' => true
會導致整個應用程式停止運作,並在幾乎每個請求上拋出 404 錯誤(包括 https://127.0.0.1/)。不僅 REST 相關的請求失敗,而且整個應用程式都無法運作。如果您設定
'enableStrictParsing' => false
(或只是移除此行,因為此組態項目預設為false
),那麼 REST 範例和其餘應用程式都將在沒有任何問題的情況下運作。我試圖弄清楚為什麼啟用
'enableStrictParsing' => true
會導致這些問題,但我失敗了,最終註解掉了該行。@Trejder 它停止運作的原因是因為此選項表示它只會解析明確宣告的 URL 路由。由於您可能沒有宣告任何路由,因此沒有任何作用。此選項將用於例如當您只想允許特定的 API 呼叫,而不想允許其他任何內容時。
註冊 或 登入 以進行評論。